/* Copyright (c) 2015 - 2017, Nordic Semiconductor ASA
 *
 * All rights reserved.
 *
 * Use in source and binary forms, redistribution in binary form only, with
 * or without modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions in binary form, except as embedded into a Nordic
 *    Semiconductor ASA integrated circuit in a product or a software update for
 *    such product, must reproduce the above copyright notice, this list of
 *    conditions and the following disclaimer in the documentation and/or other
 *    materials provided with the distribution.
 *
 * 2. Neither the name of Nordic Semiconductor ASA nor the names of its
 *    contributors may be used to endorse or promote products derived from this
 *    software without specific prior written permission.
 *
 * 3. This software, with or without modification, must only be used with a Nordic
 *    Semiconductor ASA integrated circuit.
 *
 * 4. Any software provided in binary form under this license must not be reverse
 *    engineered, decompiled, modified and/or disassembled.
 *
 * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import { spawn } from 'child_process';
import path from 'path';

function getQueryArgs(keyPath, queryString) {
    return ['query', keyPath, '/f', queryString, '/s', '/t', 'REG_SZ'];
}

function getRegExePath() {
    // Use full path to reg.exe in case the user has a different
    // reg.exe in their PATH environment variable
    return path.join(path.join(process.env.windir, 'system32'), 'reg.exe');
}

function regCmd(args) {
    return new Promise((resolve, reject) => {
        const proc = spawn(getRegExePath(), args, {
            stdio: ['ignore', 'pipe', 'pipe'],
        });

        let buffer = '';

        proc.on('close', code => {
            if (code !== 0) {
                // The reg.exe command exits with code 1 if a query returns
                // zero results. However, this could also indicate that there
                // is an error, so logging it for traceability reasons.
                console.log(
                    `The reg.exe command exited with code ${code}. ` +
                        `Arguments: ${JSON.stringify(args)}. Output: ${buffer}.`
                );
            }
            resolve(buffer);
        });

        proc.stdout.on('data', data => {
            buffer += data.toString();
        });

        proc.on('error', err => {
            reject(new Error(`Error when calling reg.exe: ${err.message}`));
        });
    });
}

function query(keyPath, queryString) {
    const args = getQueryArgs(keyPath, queryString);
    return regCmd(args);
}

/* eslint-disable import/prefer-default-export */
export { query };
